package com.cyh.testsurfaceview;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import com.cyh.testsurfaceview.glsurface1.GlSurface1Activity;
import com.cyh.testsurfaceview.glsurface2.GlSurface2Activity;
import com.cyh.testsurfaceview.surfacecamera.SurfaceCameraActivity;
import com.cyh.testsurfaceview.surfaceui1.SurfaceUI1Activity;
import com.cyh.testsurfaceview.surfacevideo.SufaceVideoActivity;
import com.cyh.testsurfaceview.texture.TextureViewActivity;

/**
 * SurfaceView
 * GLSurfaceView
 * TextureView
 * 这三个后缀都是View， 所以这三个东西都是用来显示的， 和普通的View差不多， 类似TextView等.
 *
 * 通过历史来说明：
 * SurfaceView 出现最早， 解决类似视频播放的问题（可以用单独一个线程来渲染UI）。
 * 后来发现用起来不方便， 渲染线程需要单独编写， 一大堆都可以独立成模板。
 * 所以后来就出现了 GLSurfaceView, 概括一句话就是 使用了模板的 SurfaceView。
 * 再后来发现GLSurfaceView不能根据屏幕的变化而变化， 这是由于GLSurfaceView同应用的Surface不是在同一层导致的问题。
 * 人们就想到把这个GLSurfaceView弄到应用的Surface中， 所以就产生了TextureView.
 *
 * 关键字 Texture
 * SurfaceTexture
 * 这个东西不是用来显示给用户看的， 它是一个Texture, 意识是纹理， 可以想象成一个View的中间件。
 * 举个例子：
 * 1 : Camera 把视频采集的内容交给 SurfaceView, 就变成了照相机。
 * 2：Camera 把视频采集的内容交给 SurfaceTexture， SurfaceTexture 在对内容做个美颜， 然后SurfaceTexture 再把内容交给 SurfaceView， 就变成了美图秀秀
 *
 *
 *
 *GLSurfaceView类让你更容易地使用OpenGL ES渲染你的应用程序
 *
 *
 * SurfaceView优点及缺点
 * 优点：可以在一个独立的线程中进行绘制，不会影响主线程
 *
 *           使用双缓冲机制，播放视频时画面更流畅
 *
 * 缺点：Surface不在View hierachy中，它的显示也不受View的属性控制，所以不能进行平移，缩放等变换，也不能放在其它ViewGroup中。SurfaceView 不能嵌套使用
 *
 *
 *
 * TextureView优点及缺点
 * 优点：支持移动、旋转、缩放等动画，支持截图
 *
 * 缺点：必须在硬件加速的窗口中使用，占用内存比SurfaceView高，在5.0以前在主线程渲染，5.0以后有单独的渲染线程。
 *
 *
 * 从性能和安全性角度出发，使用播放器优先选SurfaceView
 *
 *
 * SurfaceView与TextureView的比较
 *                 SurfaceView                TextureView
 * 内存              低                          高
 * 绘制              及时                        1-3帧的延时
 * 耗电              低                          高
 * 动画和截图        不支持                       支持
 *
 *
 *
 * 因为SurfaceView的内容不在应用窗口上，所以不能使用变换（平移、缩放、旋转等）。也难以放在ListView或者ScrollView中
 * 为了解决这个问题 Android 4.0中引入了TextureView
 *
 *
 * TextureView的使用非常简单，你唯一要做的就是获取用于渲染内容的SurfaceTexture。具体做法是先创建TextureView对象，然后实现SurfaceTextureListener接口
 *
 *
 * textureView的两种使用场景
 * 1)在异步线程通过canvas来绘制
 * 2)作为surface接收外界的视频等数据流
 * * */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClickToTextureViewDemo(View view) {
        startActivity(new Intent(this, TextureViewActivity.class));
    }

    public void onClickToGlsuface1(View view) {
        startActivity(new Intent(this, GlSurface1Activity.class));
    }

    public void onClickToGlsuface2(View view) {
        startActivity(new Intent(this, GlSurface2Activity.class));
    }

    public void onClickToSurfaceVideo(View view) {
        startActivity(new Intent(this, SufaceVideoActivity.class));
    }

    public void onClickToSurfaceUI1(View view) {
        startActivity(new Intent(this, SurfaceUI1Activity.class));
    }

    public void onClickToSurfaceCamera(View view) {
        startActivity(new Intent(this, SurfaceCameraActivity.class));
    }
}
